package com.sit.estatemanagementserver.service;

import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

@Service
public class WorkOrderService {

    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");

    // 用于为每种工单类型（前缀）存储其独立的日计数器
    private final Map<String, DailyCounter> counters = new ConcurrentHashMap<>();

    /**
     * 生成一个按类型独立的、按天重置的工单号。
     * @param prefix 工单号前缀，如 "R" 代表报修, "C" 代表投诉
     * @return 格式如 R20250101001 的工单号
     */
    public synchronized String generateOrderNumber(String prefix) {
        LocalDate today = LocalDate.now();

        // computeIfAbsent确保线程安全地为每个前缀获取或创建其专属的计数器对象
        DailyCounter dailyCounter = counters.computeIfAbsent(prefix, k -> new DailyCounter());

        // 检查当前计数器的日期是否是今天
        // 如果不是，说明这是今天该类型的第一个工单，重置计数器和日期
        if (!today.equals(dailyCounter.lastDate)) {
            dailyCounter.lastDate = today;
            dailyCounter.counter.set(1);
        } else {
            // 如果是同一天，计数器加1
            dailyCounter.counter.incrementAndGet();
        }

        // 格式化为三位数的序列号
        String sequence = String.format("%03d", dailyCounter.counter.get());

        return prefix + today.format(DATE_FORMATTER) + sequence;
    }

    /**
     * 内部类，用于封装每个工单类型的日计数器和最后生成日期。
     */
    private static class DailyCounter {
        private final AtomicInteger counter = new AtomicInteger(0);
        private LocalDate lastDate = LocalDate.MIN; // 初始化为一个很早的日期
    }
}